package demo01.datasource;

import com.alibaba.csp.sentinel.datasource.Converter;
import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MyDatasource  implements InitFunc {
    /**
     * 把之前在启动类编写那套加载逻辑 放到数据源里
     */
    @Override
    public void init() throws Exception {
        System.out.println("当前自定义数据源初始化init");

        // 读取文件选择使用类加载器读取文件 flowRules.json
        ClassLoader classLoader = MyDatasource.class.getClassLoader();
        URL resource = classLoader.getResource("flowRules.json");
        String fileName = resource.getFile();// flowRules.json
        // sentinel提供了一套api方法，直接将文件交给sentinel读流 转化成List<FlowRule>
        ReadableDataSource<String,List<FlowRule>> dataSource =
                new FileRefreshableDataSource<List<FlowRule>>(fileName, new Converter<String, List<FlowRule>>() {
                    /**
                     * @param json fileName 文件中的json格式的文本
                     * @return 使用json转化成对象（fastJson）
                     */
                    @Override
                    public List<FlowRule> convert(String json) {
                        return JSON.parseArray(json,FlowRule.class);
                    }
                });
        // 将规则对象的内容 注册到sentinel
        FlowRuleManager.register2Property(dataSource.getProperty());

        // 在容器启动之后设置sentinel规则
        // 定义一个规则 数组 流控规则
        /*List<FlowRule> flowRules = new ArrayList<>();
        // 生成一个 规则对象
        FlowRule flowRule = new FlowRule();
        // 使用这个规则绑定一个资源
        flowRule.setResource("sayHi");
        // 设置限流方式 0=并发限流 1=qps限流
        flowRule.setGrade(1);
        // 限流阈值
        flowRule.setCount(1);
        // 添加到规则数组中
        flowRules.add(flowRule);
        // sentinel 加载这个数组
        FlowRuleManager.loadRules(flowRules);

        FlowRule flowRule1 = new FlowRule();
        flowRule1.setResource("sayHiRepository");
        flowRule1.setGrade(1);
        flowRule1.setCount(1);
        flowRules.add(flowRule1);
        FlowRuleManager.loadRules(flowRules);*/
    }
}
